Перейти к основному содержимому

Клонирование элементов

Используйте

$new = Pimcore\Model\Element\Service::cloneMe($source)  

чтобы получить безопасную копию исходного элемента (для любого объекта, реализующего ElementInterface). Обратите внимание, что это не обновит внутренние ссылки. Например: Связь внутри исходного элемента, указывающая на сам исходный элемент, в копии по-прежнему будет ссылаться на исходный элемент.

Если вам нужна персистентная копия, используйте метод copyAsChild соответствующего сервиса. E.g.

$user = \Pimcore\Model\User::getById(123);  

$assetService = new \Pimcore\Model\Asset\Service($user);
$assetService->copyAsChild($target, $source);

$documentService = new \Pimcore\Model\Document\Service($user);
$documentService->copyAsChild($target, $source); // доступны дополнительные аргументы для наследования и др.

$objectService = new \Pimcore\Model\DataObject\Service($user);
$objectService->copyAsChild($target, $source);

Здесь $source— исходный элемент, а $target — родительский элемент, в который будет помещена новая копия. Метод copyAsChild также создаст уникальный ключ элемента (или имя файла для элементов типа asset).

Если нужно также обновить ссылки/референсы в копии, есть вспомогательный метод, который выполняет это за вас. Вызовите метод rewriteIds соответствующего сервиса и передайте конфигурацию маппера.

Пример:

$rewriteConfig = array(  
"object" => array(
176 => 190
)
);
$object = DataObject\Service::rewriteIds($object, $rewriteConfig);

В этом примере в копии все ссылки, указывавшие на объект с ID 176, будут заменены ссылками на объект с ID 190.


Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.